package br.com.simora.musica;

import java.util.List;

import javax.inject.Named;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.simora.persistence.AbstractDAO;

@Named("artistaDAO")
public class ArtistaDAO extends AbstractDAO {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2152916320582067765L;

	public Artista recuperaArtistaPorNome(String nome) {
		CriteriaBuilder qb = manager.getCriteriaBuilder();
		CriteriaQuery<Artista> cq = qb.createQuery(Artista.class);
		Root<Artista> tb = cq.from(Artista.class);
		cq.select(tb);
		cq.where(qb.equal(tb.get("nome"), nome));
		return (Artista) recuperaRegistro(montaQuery(cq));
	}
	
	public ArtistaNomeSinonimo recuperaArtistaSinonimoPorNome(String nome) {
		CriteriaBuilder qb = manager.getCriteriaBuilder();
		CriteriaQuery<ArtistaNomeSinonimo> cq = qb.createQuery(ArtistaNomeSinonimo.class);
		Root<ArtistaNomeSinonimo> tb = cq.from(ArtistaNomeSinonimo.class);
		cq.select(tb);
		cq.where(qb.equal(tb.get("nome"), nome));
		return (ArtistaNomeSinonimo) recuperaRegistro(montaQuery(cq));
	}
	
	public List<Artista> recuperaArtistasOrdenadosPorNome(Integer pagina) {
		CriteriaBuilder qb = manager.getCriteriaBuilder();
		CriteriaQuery<Artista> cq = qb.createQuery(Artista.class);
		Root<Artista> tb = cq.from(Artista.class);
		cq.select(tb);
		cq.orderBy(qb.asc(tb.get("nome")));
		return (List<Artista>) recuperaLista(montaQueryPaginada(cq, pagina));
	}

	public Integer recuperaTotalArtistas() {
		return recuperaTodos(Artista.class).size();
	}

	public List<Artista> recuperaArtistaPorNomeLike(String query) {
		CriteriaBuilder qb = manager.getCriteriaBuilder();
		CriteriaQuery<Artista> cq = qb.createQuery(Artista.class);
		Root<Artista> tb = cq.from(Artista.class);
		Expression<String> path = tb.get("nome");
		Predicate l1 = qb.like(path, query+"%");
		cq.select(tb);
		cq.where(l1);
		return (List<Artista>) recuperaLista(montaQuery(cq));
	}

}
